package comparable_1102;

// 1. 让类区实现 Comparable 接口
// Person(a) implements Comparable<Person(b)>
// 当前对象类型是 a：Person
// 可以和 b：Person 类型的对象进行比较
public class Person implements Comparable<Person> {
    private final int height;
    private final int weight;
    private final int score;
    private final int level;

    /**
     *
     * @param o the object to be compared.
     * @return
     * 小于 0 的整数： this 小于 o
     * 等于 0 的整数： this 等于 o
     * 大于 0 的整数： this 大于 o
     */
//    @Override
    public int compareTo1(Person o) {
        if (this.level > o.level) {
            // 认为 this 大于 o
            // 所以按照规范，应该返回任意一个大于 0 的整数
//            return 199999;    // 只要大于 0 就行，具体是啥无所谓
            return 1;
        } else if (this.level == o.level) {
            // 认为 this 等于 o
            return 0;
        } else {
            // this.level < o.level
            // 认为 this 小于 o
            // 返回负数
            return -2000;
        }
    }

//    @Override
//    public int compareTo(Person o) {
//        // 由于只需要返回整数、0、负数。所以上面的方法可以简写为：
//        return this.level - o.level;
//        // int - int 还是 int
//        // this.level > o.level 时，相减的结果是正数
//        // 相等时，结果是 0
//        // 小于时，结果是 负数
//    }


//    @Override
//    public int compareTo(Person o) {
//        int r = this.level - o.level;
//        if (r != 0) {
//            // this.level != o.level;
//            return r;
//        }
//
//        // 说明 this.level == o.level;
//        // 继续靠 score 确定大小
//        return this.score - o.score;
//    }


//    @Override
//    public int compareTo(Person o) {
//        int r = this.level - o.level;
//        if (r != 0) {
//            return r;
//        }
//
//        r = this.score - o.score;
//        if (r != 0) {
//            return r;
//        }
//
//        return this.weight - o.weight;
//    }


    @Override
    public int compareTo(Person o) {
        // 求出 this 对象的综合得分
        // 身高：0.3 体重: 0.2 成绩：0.5 级别：0.4
        double t = this.height * 0.3 + this.weight * 0.2 + this.score * 0.5 + this.level * 0.4;
        double s = o.height * 0.3 + o.weight * 0.2 + o.score * 0.5 + o.level * 0.4;

        if (t > s) {
            return 1;
        } else if (t == s) {
            return 0;
        } else {
            return -1;
        }
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }

        if (!(obj instanceof Person)) {
            // obj 不是 Person
            return false;
        }

        Person o = (Person) obj;
        double t = this.height * 0.3 + this.weight * 0.2 + this.score * 0.5 + this.level * 0.4;
        double s = o.height * 0.3 + o.weight * 0.2 + o.score * 0.5 + o.level * 0.4;

        return t == s;
    }

    public Person(int height, int weight, int score, int level) {
        this.height = height;
        this.weight = weight;
        this.score = score;
        this.level = level;
    }

    @Override
    public String toString() {
        return "Person{" +
                "height=" + height +
                ", weight=" + weight +
                ", score=" + score +
                ", level=" + level +
                '}';
    }
}
